﻿var depts = null;

/**************************
 * EVENT HANDLER
 */

// onload
$(document).ready(function () {
	getPhongBan();
})

function onEdit (id) {
	// populate input data
	$('#MaNV2').val(id);
	$('#HoTen2').val($('#nv' + id + ' td:nth-child(2)').text());
	$('#NgaySinh2').val($('#nv' + id + ' td:nth-child(3)').text());
	$('#DiaChi2').val($('#nv' + id + ' td:nth-child(4)').text());
	$('#Luong2').val($('#nv' + id + ' td:nth-child(6)').text());
	// Phai
	if ($('#nv' + id + ' td:nth-child(5)').text() == 'Nam') {
		$('#Nam').attr('checked', 'checked');
	} else if ($('#nv' + id + ' td:nth-child(5)').text() == 'Nữ') {
		$('#Nu').attr('checked', 'checked');
	} 
	// Phong
	$.each($('#Phong2 option'), function(index, item) { 
		if ($(item).text() == $('#nv' + id + ' td:nth-child(7)').text())
			$(item).attr('selected', 'selected');
		else
			$(item).removeAttr('selected');
	});
	
	// show dialog
	$( "#dlgNhanVien" ).dialog( "open" );
	
}

function updateNhanVien() {
	// get input
	var obj = new Object();
	obj.MaNV = $('#MaNV2').val();
	obj.HoTen = $('#HoTen2').val();
	obj.NgaySinh = $('#NgaySinh2').val();
	obj.DiaChi = $('#DiaChi2').val();
	if ($('#Nam').is(':checked')) obj.Phai = 0;
	if ($('#Nu').is(':checked')) obj.Phai = 1;
	obj.Luong = $('#Luong2').val();
	obj.Phong = $('#Phong2').val();

	// validate input
	var values = [];
	values['HoTen'] = obj.HoTen;
	values['DiaChi'] = obj.DiaChi;
	values['NgaySinh'] = obj.NgaySinh;
	values['Phai'] = obj.Phai;
	values['Luong'] = obj.Luong;
	values['Phong'] = obj.Phong;
	var errors = validateNhanVien(values);
	if (!isArrayEmpty(errors)) {
		alert(arrayToString(errors));
		return;
	}
	
	// excute job
	var data = JSON.stringify(obj);
	var onUpdate = function (result) {
		if (result) {
			var row = getEmpView(obj);
			$('#nv' + obj.MaNV).replaceWith(row);
			$('#dlgNhanVien').dialog("close");
		} else {
			alert('Không thể cập nhật thông tin nhân viên');
		}
	};
	ajax('update', data, onUpdate);
}


// check/uncheck all checkbox
function onCheckAll(obj) {
	$(":checkbox").attr('checked', obj.checked);
	if (obj.checked)
		$('[name="MaNV"]').parent().parent().addClass('selected');
	else
		$('[name="MaNV"]').parent().parent().removeClass('selected');
}

// highlight selected row
function OnCheck(obj) {
	$(obj).parent().parent().toggleClass("selected");
	if (!obj.checked)
		$('[name="CheckAll"]').attr('checked', obj.checked);
}

// delete selected row
function onBtnDeletes () {
	var count = $('[name="MaNV"]:checked').length;
	if ( count == 0) return;
	var accept = confirm("Bạn có muốn xóa các nhân viên này?"); 
	if (accept) {
		var arr = new Array();
		$.each($('[name="MaNV"]:checked'), function(index, item) { arr.push(item.value); });
		var data = JSON.stringify(arr);
		var onDeletes = function (result) {
			if (result) 
				$('[name="MaNV"]:checked').parent().parent().remove();
			else
				alert('Không thể xóa các nhân viên này');
		};
		ajax('deletes', data, onDeletes);
	}
}

//check keypressed is number
function checkNumber(obj, length, e) {
	var key = window.event ? e.keyCode : e.which; 
	var len = obj.value.length + 1; 
	begin = (length <= 3)? 48 : 45; 
	
	if (key >= begin && key <= 57 && len <= length || (key == 8 || key == 0)) {
	}
	else return false;
}

// search & dipslay
function onBtnSearch () {
	loadNhanVien($('#keyWord').val());
}

// search & dipslay
function onBtnDelete (id) {
	var onDel = function (result) {
		if (result) $('#nv' + id).remove();	// tr id=nv???
	}
	var accept = confirm("Bạn có muốn xóa nhân viên " + $('#nv' + id + ' td:nth-child(2)').text() + " ?"); 
	if (accept)
		ajax('delete', id, onDel);
}

// create NhanVien
function onBtnAdd() {
	var obj = new Object();
	obj.HoTen = $('#HoTen').val();
	obj.NgaySinh = $('#NgaySinh').val();
	obj.DiaChi = $('#DiaChi').val();
	obj.Phai = $('#Phai').val();
	obj.Luong = $('#Luong').val();
	obj.Phong = $('#Phong').val();

	// validate input
	var values = [];
	values['HoTen'] = obj.HoTen;
	values['DiaChi'] = obj.DiaChi;
	values['NgaySinh'] = obj.NgaySinh;
	values['Phai'] = obj.Phai;
	values['Luong'] = obj.Luong;
	values['Phong'] = obj.Phong;
	var errors = validateNhanVien(values);
	if (!isArrayEmpty(errors)) {
		alert(arrayToString(errors));
		return;
	}

	var data = JSON.stringify(obj);
	var onCreate = function (result) {
		if (result > 0) {
			obj.MaNV = result;
			var row = getEmpView(obj);
			$('#frmNhanVien').before(row);	// append row to table
		} else {
			alert('Không thể thêm nhân viên');
		}
	};
	ajax('create', data, onCreate);
}

// search when user press enter
function onTxtKey(event) {
	if (event.keyCode == 13) onBtnSearch();
}

// load employee table
function loadNhanVien(keyWord) {
	var onEmps = function (result) {
		var rows = '';
		for(var i = 0; i < result.length; i++) {
			var item = result[i];
			rows += getEmpView(item);
		}
		$('#frmNhanVien').before(rows);	// append rows to table
	};
	$('.nv').remove();	// remove old rows
	ajax('search', keyWord, onEmps);
}

/**************************
 * COMMON FUNCTION
 */

function getPhongBan() {
	var OnDepts = function (result) {
		depts = result;
		loadNhanVien('');
	}
	ajax('depts', '', OnDepts);
}

function getTenPhong(maPhong) {
	for(var i = 0; i < depts.length; i++) {
		var item = depts[i];
		if (item.MaPhong == maPhong) return item.TenPhong;
	}
	return '';
}

function getEmpView(emp) {
	// convert object to view
	emp.Phai = (emp.Phai == 0)? 'Nam': 'Nữ';
	emp.Phong = getTenPhong(emp.Phong);
	// conver view to html
	var row = sprintf(
			'<tr class="nv" id="nv%s">' +
			'<td><input type="checkbox" name="MaNV" value="%s" onClick="OnCheck(this)"/></td>' +
			'<td>%s</td>' +
			'<td>%s</td>' +
			'<td>%s</td>' +
			'<td>%s</td>' +
			'<td>%s</td>' +
			'<td>%s</td>' +
			'<td>' +
				'<a href="javascript: onEdit(%s)"><img src="image/edit.gif" alt="" /></a>' +
				'<a href="javascript: onBtnDelete(%s)" ><img src="image/delete.gif" alt="" /></a>' +
			'</td></tr>', emp.MaNV, emp.MaNV, emp.HoTen, emp.NgaySinh, emp.DiaChi, emp.Phai, emp.Luong, emp.Phong,
			emp.MaNV, emp.MaNV, emp.MaNV);
	return row;
}

// send async ajax post
function ajax(method, data, callback) {
	$.ajax({
		url: 'ajax.php',
		type: "POST",
		data: 'method=' + method + '&data=' + data,
		success: callback
	});
}

//check if array has no key
function isArrayEmpty(arr) {
	for (field in arr)
		return false;
	return true;
}

//combine array value to one string
function arrayToString(arr) {
	var res = '';
	for (field in arr)
		res += arr[field] + '\n';
	return res;
}

/**************************
 * NHANVIEN
 */

// validate NhanVien's input
function validateNhanVien(values) {
	var errors = [];
	checkHoTen(values, errors);
	checkNgaySinh(values, errors);
	checkDiaChi(values, errors);
	checkLuong(values, errors);
	return errors;	// return array of error detected
} 

// required, maxlen(20)
function checkHoTen(values, errors) {
	try {
		var value = values['HoTen'];
		if (value.length == 0) throw 'Chưa nhập họ tên';
		if (value.length > 20) throw 'Họ tên phải ngắn hơn 20 ký tự';
	} catch (msg) {
		errors['HoTen'] = msg;
	}
}

// required, format(dd/MM/yyyy)
function checkNgaySinh(values, errors) {
	try {
		var value = values['NgaySinh'];
		if (value.length == 0) throw 'Chưa nhập ngày sinh';
		var date = $.datepicker.parseDate( 'dd/mm/yy', value);	// throw exception if failed
	} catch (msg) {
		if (msg == 'Invalid date') msg = 'Ngày sinh không hợp lệ';
		errors['NgaySinh'] = msg;
	}
}

// maxlen(100)
function checkDiaChi(values, errors) {
	try {
		var value = values['DiaChi'];
		if (value.length > 100) throw 'Địa chỉ phải ngắn hơn 100 ký tự';
	} catch (msg) {
		errors['DiaChi'] = msg;
	}
}

// float
function checkLuong(values, errors) {
	try {
		var value = values['Luong'];
		if (value != '' && isNaN(parseInt(value))) throw 'Lương phải là số nguyên';
	} catch (msg) {
		errors['Luong'] = msg;
	}
}

// required, {0, 1}
function checkPhai(values, errors) {
	try {
		var value = values['Phai'];
		if (value == undefined) throw 'Chưa chọn giới tính';
	} catch (msg) {
		errors['Phai'] = msg;
	}
}
